home *** CD-ROM | disk | FTP | other *** search
- /* SC A Spreadsheet Calculator
- * Main driver
- *
- * original by James Gosling, September 1982
- * modifications by Mark Weiser and Bruce Israel,
- * University of Maryland
- *
- * More mods Robert Bond, 12/86
- *
- */
-
- #include <curses.h>
- #include "sc.h"
-
- #ifdef BSD42
- #include <strings.h>
- #else
- #ifndef SYSIII
- #include <string.h>
- #endif
- #endif
-
- duprow()
- {
- if (currow >= MAXROWS - 1 || maxrow >= MAXROWS - 1) {
- error ("The table can't be any bigger");
- return;
- }
- modflg++;
- currow++;
- openrow (currow);
- for (curcol = 0; curcol <= maxcol; curcol++) {
- register struct ent *p = tbl[currow - 1][curcol];
- if (p) {
- register struct ent *n;
- n = lookat (currow, curcol);
- n -> v = p -> v;
- n -> flags = p -> flags;
- n -> expr = copye (p -> expr, 1, 0);
- n -> label = 0;
- if (p -> label) {
- n -> label = (char *)
- xmalloc ((unsigned)(strlen (p -> label) + 1));
- (void) strcpy (n -> label, p -> label);
- }
- }
- }
- for (curcol = 0; curcol <= maxcol; curcol++) {
- register struct ent *p = tbl[currow][curcol];
- if (p && (p -> flags & is_valid) && !p -> expr)
- break;
- }
- if (curcol > maxcol)
- curcol = 0;
- }
-
- dupcol()
- {
- if (curcol >= MAXCOLS - 1 || maxcol >= MAXCOLS - 1) {
- error ("The table can't be any wider");
- return;
- }
- modflg++;
- curcol++;
- opencol (curcol);
- for (currow = 0; currow <= maxrow; currow++) {
- register struct ent *p = tbl[currow][curcol - 1];
- if (p) {
- register struct ent *n;
- n = lookat (currow, curcol);
- n -> v = p -> v;
- n -> flags = p -> flags;
- n -> expr = copye (p -> expr, 0, 1);
- n -> label = 0;
- if (p -> label) {
- n -> label = (char *)
- xmalloc ((unsigned) (strlen (p -> label) + 1));
- (void) strcpy (n -> label, p -> label);
- }
- }
- }
- for (currow = 0; currow <= maxrow; currow++) {
- register struct ent *p = tbl[currow][curcol];
- if (p && (p -> flags & is_valid) && !p -> expr)
- break;
- }
- if (currow > maxrow)
- currow = 0;
- }
-
- insertrow(arg)
- {
- while (--arg>=0) openrow (currow);
- }
-
- deleterow(arg)
- {
- flush_saved();
- erase_area(currow, 0, currow + arg - 1, maxcol);
- currow += arg;
- while (--arg>=0) closerow (--currow);
- sync_refs();
- }
-
- insertcol(arg)
- {
- while (--arg>=0) opencol(curcol);
- }
-
- deletecol(arg)
- {
- flush_saved();
- erase_area(0, curcol, maxrow, curcol + arg - 1);
- curcol += arg;
- while (--arg>=0) closecol (--curcol);
- sync_refs();
- }
-
- rowvalueize(arg)
- {
- valueize_area(currow, 0, currow + arg - 1, maxcol);
- }
-
- colvalueize(arg)
- {
- valueize_area(0, curcol, maxrow, curcol + arg - 1);
- }
-
- erase_area(sr, sc, er, ec)
- int sr, sc, er, ec;
- {
- register int r, c;
- register struct ent **p;
-
- if (sr > er) {
- r = sr; sr = er; er= r;
- }
-
- if (sc > ec) {
- c = sc; sc = ec; ec= c;
- }
-
- if (sr < 0)
- sr = 0;
- if (sc < 0)
- sc = 0;
- if (er >= MAXROWS)
- er = MAXROWS-1;
- if (ec >= MAXCOLS)
- ec = MAXCOLS-1;
-
- for (r = sr; r <= er; r++) {
- for (c = sc; c <= ec; c++) {
- p = &tbl[r][c];
- if (*p) {
- free_ent(*p);
- *p = 0;
- }
- }
- }
-
- }
-
- valueize_area(sr, sc, er, ec)
- int sr, sc, er, ec;
- {
- register int r, c;
- register struct ent *p;
-
- if (sr > er) {
- r = sr; sr = er; er= r;
- }
-
- if (sc > ec) {
- c = sc; sc = ec; ec= c;
- }
-
- if (sr < 0)
- sr = 0;
- if (sc < 0)
- sc = 0;
- if (er >= MAXROWS)
- er = MAXROWS-1;
- if (ec >= MAXCOLS)
- ec = MAXCOLS-1;
-
- for (r = sr; r <= er; r++) {
- for (c = sc; c <= ec; c++) {
- p = tbl[r][c];
- if (p && p->expr) {
- efree(p->expr);
- p->expr = 0;
- p->flags &= ~is_strexpr;
- }
- }
- }
-
- }
-
- pullcells(to_insert)
- {
- register struct ent *p, *n;
- register int deltar, deltac;
- int minrow, mincol;
- int mxrow, mxcol;
- int numrows, numcols;
-
- if (!to_fix)
- return;
-
- switch (to_insert) {
- case 'm':
- case 'r':
- case 'c':
- break;
- default:
- error("Invalid pull command");
- return;
- }
-
- minrow = MAXROWS;
- mincol = MAXCOLS;
- mxrow = 0;
- mxcol = 0;
-
- for (p = to_fix; p; p = p->next) {
- if (p->row < minrow)
- minrow = p->row;
- if (p->row > mxrow)
- mxrow = p->row;
- if (p->col < mincol)
- mincol = p->col;
- if (p->col > mxcol)
- mxcol = p->col;
- }
-
- numrows = mxrow - minrow + 1;
- numcols = mxcol - mincol + 1;
- deltar = currow - minrow;
- deltac = curcol - mincol;
-
- if (to_insert == 'r') {
- insertrow(numrows);
- deltac = 0;
- } else if (to_insert == 'c') {
- insertcol(numcols);
- deltar = 0;
- }
-
- FullUpdate++;
- modflg++;
-
- for (p = to_fix; p; p = p->next) {
- n = lookat (p->row + deltar, p->col + deltac);
- (void) clearent(n);
- n -> flags = p -> flags & ~is_deleted;
- n -> v = p -> v;
- n -> expr = copye(p->expr, deltar, deltac);
- n -> label = 0;
- if (p -> label) {
- n -> label = (char *)
- xmalloc((unsigned)(strlen(p->label)+1));
- (void) strcpy (n -> label, p -> label);
- }
- }
- }
-
- colshow_op()
- {
- register int i,j;
- for (i=0; i<MAXCOLS; i++)
- if (col_hidden[i])
- break;
- for(j=i; j<MAXCOLS; j++)
- if (!col_hidden[j])
- break;
- j--;
- if (i<MAXCOLS) {
- (void) sprintf(line,"show %s:", coltoa(i));
- (void) sprintf(line + strlen(line),"%s",coltoa(j));
- linelim = strlen (line);
- }
- }
-
- rowshow_op()
- {
- register int i,j;
- for (i=0; i<MAXROWS; i++)
- if (row_hidden[i])
- break;
- for(j=i; j<MAXROWS; j++)
- if (!row_hidden[j]) {
- break;
- }
- j--;
- if (i<MAXROWS) {
- (void) sprintf(line,"show %d:%d", i, j);
- linelim = strlen (line);
- }
- }
-
- get_qual()
- {
- register int c;
-
- c = nmgetch();
- switch (c) {
- case 'c':
- case 'j':
- case 'k':
- case ctl(p):
- case ctl(n):
- return('c');
- case 'r':
- case 'l':
- case 'h':
- case ctl(f):
- case ctl(b):
- return('r');
- default:
- return(c);
- }
- /*NOTREACHED*/
- }
-
- openrow (rs) {
- register r;
- register struct ent **p;
- register c;
- register i;
-
- if (rs > maxrow) maxrow = rs;
- if (maxrow >= MAXROWS - 1 || rs > MAXROWS - 1) {
- error ("The table can't be any longer");
- return;
- }
- for (i = maxrow+1; i > rs; i--) {
- row_hidden[i] = row_hidden[i-1];
- }
- for (r = ++maxrow; r > rs; r--)
- for (c = maxcol + 1, p = &tbl[r][0]; --c >= 0; p++)
- if (p[0] = p[-MAXCOLS])
- p[0] -> row++;
- p = &tbl[rs][0];
- for (c = maxcol + 1; --c >= 0;)
- *p++ = 0;
- FullUpdate++;
- modflg++;
- }
-
- closerow (r)
- register r; {
- register struct ent **p;
- register c;
- register int i;
-
- if (r > maxrow) return;
-
- p = &tbl[r][0];
- for (c=maxcol+1; --c>=0; ) {
- if (*p)
- free_ent(*p);
- *p++ = 0;
- }
-
- for (i = r; i < MAXROWS - 1; i++) {
- row_hidden[i] = row_hidden[i+1];
- }
-
- while (r<maxrow) {
- for (c = maxcol+1, p = &tbl[r][0]; --c>=0; p++)
- if (p[0] = p[MAXCOLS])
- p[0]->row--;
- r++;
- }
-
- p = &tbl[maxrow][0];
- for (c=maxcol+1; --c>=0; ) *p++ = 0;
- maxrow--;
- FullUpdate++;
- modflg++;
- }
-
- opencol (cs) {
- register r;
- register struct ent **p;
- register c;
- register lim = maxcol-cs+1;
- int i;
-
- if (cs > maxcol) maxcol = cs;
- if (maxcol >= MAXCOLS - 1 || cs > MAXCOLS - 1) {
- error ("The table can't be any wider");
- return;
- }
- for (i = maxcol+1; i > cs; i--) {
- fwidth[i] = fwidth[i-1];
- precision[i] = precision[i-1];
- col_hidden[i] = col_hidden[i-1];
- }
- /* fwidth[cs] = DEFWIDTH;
- precision[i] = DEFPREC; */
-
- for (r=0; r<=maxrow; r++) {
- p = &tbl[r][maxcol+1];
- for (c=lim; --c>=0; p--)
- if (p[0] = p[-1])
- p[0]->col++;
- p[0] = 0;
- }
- maxcol++;
- FullUpdate++;
- modflg++;
- }
-
- closecol (cs) {
- register r;
- register struct ent **p;
- register struct ent *q;
- register c;
- register lim = maxcol-cs;
- int i;
-
- if (lim < 0) return;
-
- for (r=0; r<=maxrow; r++)
- if (q = tbl[r][cs]) {
- free_ent(q);
- }
-
- for (r=0; r<=maxrow; r++) {
- p = &tbl[r][cs];
- for (c=lim; --c>=0; p++)
- if (p[0] = p[1])
- p[0]->col--;
- p[0] = 0;
- }
-
- for (i = cs; i < MAXCOLS - 1; i++) {
- fwidth[i] = fwidth[i+1];
- precision[i] = precision[i+1];
- col_hidden[i] = col_hidden[i+1];
- }
-
- maxcol--;
- FullUpdate++;
- modflg++;
- }
-
- doend(rowinc, colinc)
- {
- register struct ent *p;
- int r, c;
-
- if (VALID_CELL(p, currow, curcol)) {
- r = currow + rowinc;
- c = curcol + colinc;
- if (r >= 0 && r < MAXROWS &&
- c >= 0 && c < MAXCOLS &&
- !VALID_CELL(p, r, c)) {
- currow = r;
- curcol = c;
- }
- }
-
- if (!VALID_CELL(p, currow, curcol)) {
- switch (rowinc) {
- case -1:
- while (!VALID_CELL(p, currow, curcol) && currow > 0)
- currow--;
- break;
- case 1:
- while (!VALID_CELL(p, currow, curcol) && currow < MAXROWS-1)
- currow++;
- break;
- case 0:
- switch (colinc) {
- case -1:
- while (!VALID_CELL(p, currow, curcol) && curcol > 0)
- curcol--;
- break;
- case 1:
- while (!VALID_CELL(p, currow, curcol) && curcol < MAXCOLS-1)
- curcol++;
- break;
- }
- break;
- }
- return;
- }
-
- switch (rowinc) {
- case -1:
- while (VALID_CELL(p, currow, curcol) && currow > 0)
- currow--;
- break;
- case 1:
- while (VALID_CELL(p, currow, curcol) && currow < MAXROWS-1)
- currow++;
- break;
- case 0:
- switch (colinc) {
- case -1:
- while (VALID_CELL(p, currow, curcol) && curcol > 0)
- curcol--;
- break;
- case 1:
- while (VALID_CELL(p, currow, curcol) && curcol < MAXCOLS-1)
- curcol++;
- break;
- }
- break;
- }
- if (!VALID_CELL(p, currow, curcol)) {
- currow -= rowinc;
- curcol -= colinc;
- }
- }
-
- doformat(c1,c2,w,p)
- int c1,c2,w,p;
- {
- register int i;
-
- if (w > COLS - RESCOL - 2) {
- error("Format too large - Maximum = %d", COLS - RESCOL - 2);
- w = COLS-RESCOL-2;
- }
-
- if (p > w) {
- error("Precision too large");
- p = w;
- }
-
- for(i = c1; i<=c2; i++)
- fwidth[i] = w, precision[i] = p;
-
- FullUpdate++;
- modflg++;
- }
-